/*
request.js封装
1：安装axios
2:导入axios
3:创建axios副本，配制基地址
  在线接口基地址:http://119.91.150.211:3000/api
  本地接口基地址:  http://localhost:3000/api
4：创建请求拦截与响应拦截
5：暴露出去
6:创建api
7:导入调用
*/
// 开发环境  npm run dev
// 生产环境  npm run build
// 环境变量：自动识别相应环境
//    开发环境  npm run dev  就自动读取开发环境的变量值
//    生产环境  npm run build  就自动读取生产环境的变量值
/*
为什么配制环境变量：
   不要上线前还要修改代码，希望它根据不同环境使用不同的变量值
开发环境环境变量配制
   1：项目的根目录（package.json同级目录）创建一个文件.env.development
   2:在文件中定义环境变量
     规则：以  VUE_APP_开头
        比如：VUE_APP_XXX='123'
   3:使用环境变量
      process.env.VUE_APP_XXX
生产环境环境变量配制
   1：项目的根目录（package.json同级目录）创建一个文件.env.production
   2:在文件中定义环境变量
     规则：以  VUE_APP_开头
        比如：VUE_APP_XXX='123'
   3:使用环境变量
      process.env.VUE_APP_XXX
   最常见的就是配制接口基地址
   注意点：配制完要重启脚手架
*/

import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
const _axios = axios.create({
  baseURL: process.env.VUE_APP_URL
  // baseURL: 'http://119.91.150.211:3000/api'
})
_axios.interceptors.request.use(
  (config) => {
    /*
      统一token处理：
      实际开发时：
        1：不需要加入token的接口你加了也不会报错（绝大部分是这样的）
          config.headers.Authorization = `Bearer ${store.state.user.token}`
        2：不需要加入token的接口你加了直接报错
          解决？
          a:api配制中加入  noToken:true
          b:导航守卫
              if(!config.noToken){
                config.headers.Authorization = `Bearer ${store.state.user.token}`
              }
    */
    if (!config.noToken) {
      config.headers.Authorization = `Bearer ${store.state.user.token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)
// 响应拦截
_axios.interceptors.response.use(
  // 状态码：2开头
  (res) => {
    if (res.data.success) {
      return res.data
    } else {
      // 错误提示
      // alert(res.data.message)
      Message.error(res.data.message)
      // 中止.then的执行，执行.catch
      return Promise.reject(res.data.message)
    }
  },
  // 非2开头,语法错误它也会来这里
  (error) => {
    // console.log(error)
    // console.dir(error)
    if (error.response && error.response.status === 401) {
      // 删除token
      store.commit('user/logout')
      // 错误显示
      Message.error(error.response.data.message)
    }
    return Promise.reject(error)
  }
)
export default _axios
